import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class VuePiste extends JPanel {

	MPlayer mPlayer = new MPlayer();
	
	private Piste piste; // liaison au modèle

	private VueParamPiste paramPiste; // agrégat - composant
	private VueCanal[] vueCanaux; // agrégat - composant
	private JLabel titrePiste;
	private JSlider ctlEchelleHorizontale;
	private JSlider ctlOffsetHorizontale;
	private JSlider ctlEchelleVerticale;
	private JButton boutonplay;
	private JButton boutonstop;
	private JButton boutonreset;

	private ControleurPiste ctlPiste = new ControleurPiste();
	private JPanel conteneurCanaux;
	private int premierEch, dernierEch;
	private double amplitude;
	private double scaleX = 10.0;
	private int nbechparpixel;

	void miseAjourEchelles() {
		nbechparpixel = (piste.getCanal(0).getNbEch() * ctlEchelleHorizontale
				.getValue()) / (100 * (getWidth() - 20));
		if (nbechparpixel == 0)
			nbechparpixel = 1;
		premierEch = (((ctlOffsetHorizontale.getValue() * piste.getCanal(0)
				.getNbEch()) / 100) / nbechparpixel) * nbechparpixel;
		dernierEch = premierEch
				+ (piste.getCanal(0).getNbEch() * ctlEchelleHorizontale
						.getValue()) / 100;
		amplitude = ctlEchelleVerticale.getValue();
	}

	class ControleurPiste implements ChangeListener {
		public void stateChanged(ChangeEvent e) {
			repaint();
		}

	}

	class VueCanal extends JPanel {
		private Canal canal; // liaison au modele

		VueCanal(Canal c) {
			canal = c;
			setBackground(Color.white);
		}

		public void paintComponent(Graphics g) {
			double scaleY = (getHeight() / 2.0) / canal.getMaxi();
			int curseur;
			int y, y_1 = 0;
			// System.out.println(getHeight() + " " + getWidth() + " " +
			// scaleY);
			super.paintComponent(g);
			g.drawRect(0, 2, getWidth() - 2, getHeight() - 4);
			g.drawLine(0, +(getHeight() / 2), getWidth() - 2, (getHeight() / 2));
			curseur = premierEch;
			g.setColor(Color.blue);
			miseAjourEchelles();
			for (int i = 0; i < getWidth() - 20; i++) {
				y = (int) (canal.getMoyenneEchantillon(curseur, nbechparpixel)
						* scaleY * amplitude);
				g.drawLine(i - 1, y_1 + (getHeight() / 2), i, y
						+ (getHeight() / 2));
				curseur += nbechparpixel;
				y_1 = y;
				// System.out.println(canal.getMoyenneEchantillon(curseur,
				// nbechparpixel ));
			}
		}

	}

	class VueParamPiste extends JPanel {
		VueParamPiste() {
		}
	}
	
    /*
     * BoutonListener
     * 
     * Classe qui ecoute les actions sur les boutons de l'interface.
     */
	public class BoutonListener implements ActionListener {
		MPlayer player;
		
	    /*
	     * Rend active la piste sur le player en parametre
	     */
		public Boolean activerPiste(Piste piste) {
			if(piste.estActive()) {
				piste.finLecture();
				player.terminer();
				return false;
			}
			piste.initLecture();
			player.play(piste);
			return true;
		}

		// Actions attachees aux boutons Play et Stop
		@Override	
		public void actionPerformed(ActionEvent e) {
			Object source = e.getSource();
			if(source == boutonplay) {
				if(piste.estActive()) {
					piste.initLecture();
					piste.getPlayer().play(piste);
					System.out.println("Play");	
				}
			} else if(source == boutonstop) {
				if(piste != null) {
					piste.finLecture();
					MPlayer mplayer = piste.getPlayer();
					if(mplayer != null) {
						mplayer.terminer();
						System.out.println("Stop");
					} else {
						System.out.println("La piste est deja stoppee.");
					}
				}
			}
		}
}
		
		

	VuePiste(Piste p) {
		piste = p;
		setLayout(new BorderLayout());
		paramPiste = new VueParamPiste();
		paramPiste.setLayout(new BoxLayout(paramPiste, BoxLayout.Y_AXIS));
		paramPiste.setBorder(new EtchedBorder());
		paramPiste.setPreferredSize(new Dimension(200, getHeight()));

		ctlEchelleHorizontale = new JSlider(10, 100, 100);
		ctlOffsetHorizontale = new JSlider(0, 100, 0);
		ctlEchelleVerticale = new JSlider(1, 100, 5);
		boutonplay = new JButton("Bouton Play");
		boutonstop = new JButton("Bouton Stop");
		boutonreset = new JButton("Bouton Reset");		

		JLabel lab = new JLabel(piste.getTitre());
		paramPiste.add(lab);

		lab = new JLabel("Zoom horizontal");
		Font ft = new Font("Monaco", Font.PLAIN, 8);
		lab.setFont(ft);
		paramPiste.add(lab);

		paramPiste.add(ctlEchelleHorizontale);
		lab = new JLabel("Offset horizontal");
		lab.setFont(ft);
		paramPiste.add(lab);

		paramPiste.add(ctlOffsetHorizontale);
		lab = new JLabel("Zoom vertical");
		lab.setFont(ft);
		paramPiste.add(lab);
		
		paramPiste.add(boutonplay);
		boutonplay.addActionListener(new BoutonListener());
		paramPiste.add(boutonstop);
		boutonstop.addActionListener(new BoutonListener());
		paramPiste.add(boutonreset);
		boutonreset.addActionListener(new BoutonListener());

		/*--------------*/
		
		paramPiste.add(ctlEchelleVerticale);
		ctlEchelleHorizontale.addChangeListener(ctlPiste);
		ctlOffsetHorizontale.addChangeListener(ctlPiste);
		ctlEchelleVerticale.addChangeListener(ctlPiste);

		conteneurCanaux = new JPanel();
		conteneurCanaux.setLayout(new BoxLayout(conteneurCanaux,
				BoxLayout.Y_AXIS));
		conteneurCanaux.setBackground(Color.red);
		conteneurCanaux.setBorder(new EmptyBorder(10, 10, 10, 10));
		vueCanaux = new VueCanal[piste.getNbCanaux()];
		for (int i = 0; i < vueCanaux.length; i++) {
			vueCanaux[i] = new VueCanal(piste.getCanal(i));
			conteneurCanaux.add(vueCanaux[i]);
		}

		miseAjourEchelles();
		add(paramPiste, BorderLayout.WEST);
		add(new JScrollPane(conteneurCanaux), BorderLayout.CENTER);

	
	
	   paramPiste.add(boutonstop);
	   boutonstop.addActionListener(new ActionListener() 
 	   {
		   public void actionPerformed(ActionEvent e) 
		   {
			   mPlayer.suspend();
		   }
 	   });
		}
        
	public static void main(String[] a) {
		JFrame test = new JFrame("*** Player Izarn Puia ***");
		Piste piste1 = Piste.loadFromRawFile("dsquiban.raw", 2, 16000, 2);
		Piste piste2 = Piste.loadFromRawFile("lesEtoiles.raw", 1, 16000, 2);
		VuePiste vp = new VuePiste(piste1);
		VuePiste vp2 = new VuePiste(piste2);
		JPanel lesPistes = new JPanel();
		lesPistes.setLayout(new BoxLayout(lesPistes, BoxLayout.Y_AXIS));
		test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		lesPistes.add(vp);
		lesPistes.add(vp2);
		test.add(new JScrollPane(lesPistes));
		test.setSize(800, 400);
		test.setVisible(true);
		MPlayer mp1 = new MPlayer();
		piste1.addPlayer(mp1);
		MPlayer mp2 = new MPlayer();
		piste2.addPlayer(mp2);
	}  	  

}
